/**
 * MiStringTokenizer
 *
 * Sencilla clase para poder tokenizar por mas de un caracter.
 * Ejemplo:
 *
 * 1 | 2 ||| 3 ||| 4 | 5 | 6 con StringTokenizer normal devuelve 1,2,3,4,5,6
 * con MiStringTokenizer devuelve 1|2|,3,4|5|6
 *
 * @author jdelgado
 * @version 0.0.0.1 - Version inicial puede tener errores
 * @since 27 Feb 2007 - Eclipse 3.2
 */
package business;

import java.util.StringTokenizer;

public class MiStringTokenizer {

    private String cadena;
    private String delimitador;
    private String _procesa;

    /**
     * Constructor
     * @param cadena cadena a procesar
     * @param multipledelimitador tokenizador
     */
    public MiStringTokenizer(String cadena, String multipledelimitador) {
        this.cadena = cadena;
        this.delimitador = multipledelimitador;
        this._procesa = cadena;
    }

    /**
     * Cuenta el numero de tokens
     * @return el numero de tokens
     */
    public int countTokens() {
        try {
            int len = cadena.length();
            if (this.cadena == null) {
                return 0;
            }
            if (len == 0) {
                return 0;
            }
            if (this.delimitador == null) {
                return 0;
            }
            int del_len = this.delimitador.length();
            if (del_len == 0) {
                return 0;
            }
            String trata = cadena;
            int count = 1;
            int posic = trata.indexOf(this.delimitador);
            while (posic != -1) {
                trata = trata.substring(posic + del_len);
                count++;
                posic = trata.indexOf(this.delimitador);
            }
            return count;
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * Indica si quedan tokens por procesar
     * @return variable booleanda indicando si quedan tokens para procesar
     */
    public boolean hasMoreTokens() {
        if (this._procesa == null) {
            return false;
        }
        if (this._procesa.length() == 0) {
            return false;
        }
        int posi = _procesa.indexOf(this.delimitador);
        return (posi != -1 || _procesa.length() > 0);
    }
    
    /**
     * Devuelve el proximo token
     * @return un String con el proximo token
     * @throws Exception Excepcion levantada en caso de error
     */
    public String nextToken()
    {
        /*if (_procesa == null) {
            throw new Exception("no quedan tokens");
        }*/
        String token = "";
        int posi = _procesa.indexOf(this.delimitador);
        if (posi != -1) {
            int len = this.delimitador.length();
            token = _procesa.substring(0, posi);
            _procesa = _procesa.substring(posi + len);
        } else {
            token = _procesa;
            _procesa = null;
        }
        return token;
    }
}
